#ifndef _WX_HTTP_H
#define _WX_HTTP_H

#include "wx/defs.h"
#include "wx/hashmap.h"
#include "wx/protocol/protocol.h"
#include <tr1/unordered_map>

typedef std::tr1::unordered_map< wxString, wxString, wxStringHash, wxStringEqual > wxStringToStringHashMap;

class wxHTTP : public wxProtocol {
  public:
    wxHTTP();
    virtual ~wxHTTP();
    virtual bool Connect( const wxString& host, unsigned short port );
    virtual bool Connect( const wxString& host ) { return Connect( host, 0 ); }
    virtual bool Connect( wxSockAddress& addr, bool wait );
    bool Abort();
    wxInputStream *GetInputStream( const wxString& path );
    inline wxProtocolError GetError() { return m_perr; }
    wxString GetContentType();
    void SetHeader( const wxString& header, const wxString& h_data );
    wxString GetHeader( const wxString& header ) const;
    void SetPostBuffer( const wxString& post_buf );
    void SetProxyMode( bool on );
    int GetResponse() { return m_http_response; }
    virtual void SetUser( const wxString& user ) { m_username = user; }
    virtual void SetPassword( const wxString& passwd ) { m_password = passwd; }
  protected:
    enum wxHTTP_Req {
      wxHTTP_GET,
      wxHTTP_POST,
      wxHTTP_HEAD
    };

    typedef wxStringToStringHashMap::iterator wxHeaderIterator;
    typedef wxStringToStringHashMap::const_iterator wxHeaderConstIterator;
    bool BuildRequest( const wxString& path, wxHTTP_Req req );
    void SendHeaders();
    bool ParseHeaders();
    wxString GenerateAuthString( const wxString& user, const wxString& pass ) const;
    wxHeaderIterator FindHeader( const wxString& header );
    wxHeaderConstIterator FindHeader( const wxString& header ) const;
    void ClearHeaders();
    wxProtocolError m_perr;
    wxStringToStringHashMap m_headers;
    bool m_read,
         m_proxy_mode;
    wxSockAddress *m_addr;
    wxString m_post_buf;
    int m_http_response;
    wxString m_username;
    wxString m_password;
    DECLARE_DYNAMIC_CLASS( wxHTTP )
    DECLARE_PROTOCOL( wxHTTP )
    DECLARE_NO_COPY_CLASS( wxHTTP )
};

#endif
